import type { ObserverImpl } from '../declarations';

/**
 * - 作者: DoooReyn
 * - 日期: 2023.10.29
 * - 名称: Observer
 * - 描述: 观察者模式
 */
export class Observer {
    /** 观察者列表 */
    protected _observers: ObserverImpl[] = [];

    /**
     * 添加观察者
     * @param ob 观察者
     **/
    public add(ob: ObserverImpl): void {
        const at = this._observers.indexOf(ob);
        if (at === -1) {
            this._observers.push(ob);
            ob.onAdded && ob.onAdded();
        }
    }

    /**
     * 移除观察者
     * @param ob 观察者
     */
    public remove(ob: ObserverImpl): void {
        const at = this._observers.indexOf(ob);
        if (at > -1) {
            this._observers.splice(at, 1);
            ob.onRemoved && ob.onRemoved();
        }
    }

    /** 移除所有观察者 */
    public clear() {
        const all = this._observers.slice();
        for (let ob of all) ob.onRemoved && ob.onRemoved();
        this._observers.length = 0;
    }

    /** 通知观察者 */
    public notify(): void {
        const all = this._observers.slice();
        for (let ob of all) ob.onUpdate();
    }
}
